引用的理解
引用:类似于C语言的指针,多个变量名/对象名可以指向同一块内存数据。
每个对象存在至少1个引用。
python中一切都是对象,一切标识名称都是真实对象的引用。
1
2
3
4
5
6
7
8li = [1,3,4]
lt = li
id(li)
id(lt)
'''
1955588376200
1955588376200
'''python内部机制对引用的处理
- 不可变对象:immutable 解释器为相同值维护尽量少的内存区域
- 可变对象:mutable 解释器为每个对象维护不同内存区域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16a = 'aaa'
b = a
c = 'a'
d = 'aa'
e = c + d
f = 'aaa'
for i in [a,b,c,d,e,f]:
print(id(i))
'''
2438022394856
2438022394856
2438022277416
2438025612456
2438025476112
2438022394856
'''1
2
3
4
5
6
7
8
9
10
11a = []
b = a
c = []
for i in [a,b,c]:
print(id(i))
'''
1955587514632
1955587514632
1955587201480
'''查看某个对象被多少标识名称引用,即查看对象被引用了多少次:
sys.getrefcount()返回值为 被引用次数+1
导致引用+1的情况:
- 对象被创建:d = list()
- 对象被引用:a = d
- 对象被作为函数或方法的参数:sys.getrefcount(d)
- 对象被作为一个容器中的元素:ls = [d]
导致引用-1的情况:
方法或函数也是对象,方法名/函数名是它的一个引用。
对象名.方法名(方法参数) 等价于 类名.方法名(对象名, 方法参数)
1 | def func(a, b): |
1 | class A(object): |
浅拷贝和深拷贝
拷贝:复制一个对象为内存空间中新的对象。
浅拷贝:仅复制最顶层对象的拷贝方式,默认
深拷贝:迭代复制对象内所有层次的对象的拷贝方式。深拷贝仅针对可变类型,不可变类型无需创建新对象。
1 | import copy |